package com.example.springbatch4;

import com.example.springbatch3.NameParamValidator;
import com.sun.scenario.effect.impl.prism.PrImage;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.job.CompositeJobParametersValidator;
import org.springframework.batch.core.job.DefaultJobParametersValidator;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Map;

@SpringBootApplication
@EnableBatchProcessing //启用springbatch框架 需要的注解
public class SpringBatchApplication4 {

    // job调度器
    @Autowired
    private JobLauncher jobLauncher;

    // job构建工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    // step步骤构建工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;


    // 任务step执行逻辑由 tasklet完成
    @StepScope //等到调用的时候再加载这个bean对象
    @Bean
    public Tasklet tasklet1() {
        return (stepContribution, chunkContext) -> {
            // 方法1，直接通过chunkContext去获取jobParameter
            Map<String, Object> jobParameters = chunkContext.getStepContext().getJobParameters();

//            Object name = jobParameters.get("name");
//            System.out.println("Hello Params !---" + name);

            Object daily = jobParameters.get("daily");
            System.out.println("daily = " + daily);

            // 方法2，通过延时加载去获取jobParameter

//            System.out.println("Hello Pamams ! ---" + name);


            System.err.println();
            // 返回执行任务完成
            return RepeatStatus.FINISHED;
        };
    }

    // 作业步骤 不带不读写操作
    @Bean
    public Step step1() {
        // 如果是通过延时加载去获取参数 那么这里的入参就置为null
        return stepBuilderFactory.get("step1").tasklet(tasklet1()).build();
    }

    @Resource(name = "dailyTimestampParamIncrementer")
    private JobParametersIncrementer jobParametersIncrementer;


    @Bean
    public Job job() {
        return jobBuilderFactory
                .get("job-param-composite-validator")
//                .incrementer(new RunIdIncrementer())    // 使用增量器(run.id自增)
                .incrementer(jobParametersIncrementer)    // 使用日期增量器
                .start(step1()).
                build();
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBatchApplication4.class, args);
    }

}
